class hkVector4f
{
	public:
		HK_DECLARE_POD_TYPE();


		/// Normalizes \a v as an N-component vector, stores with self and returns the length of \a v before normalization. ( return self = |v| ).
		/// If \a v is zero (within machine epsilon), self is set to the unit vector (1,0,0,0).
		/// Accuracy: 23 bit.
		template <int N> HK_FORCE_INLINE const hkSimdFloat32 setNormalizedEnsureUnitLength(hkVector4fParameter v);

		/// Sets value of component \a i of \a v on the xyz components of self. The w component of self is undefined afterwards.
		/// \remark Use this method only if the component index is not a compile time constant.
		HK_FORCE_INLINE void setBroadcastXYZ(const int i, hkVector4fParameter v);

		/// Return address of component I for read only access.  (0,1,2,3) correspond to the (x,y,z,w) components respectively.
		template <int I> HK_FORCE_INLINE const hkFloat32* getComponentAddress() const;

		/// Return address of component I for read/write access.  (0,1,2,3) correspond to the (x,y,z,w) components respectively.
		template <int I> HK_FORCE_INLINE hkFloat32* getComponentAddress();

		/// Return address of component \a i for read only access.  (0,1,2,3) correspond to the (x,y,z,w) components respectively.
		/// \remark Use this method only when the component index is not a compile time constant.
		HK_FORCE_INLINE const hkFloat32* getComponentAddress(int i) const;

		/// Return address of component \a i for read/write access.  (0,1,2,3) correspond to the (x,y,z,w) components respectively.
		/// \remark Use this method only when the component index is not a compile time constant.
		HK_FORCE_INLINE hkFloat32* getComponentAddress(int i);

		/// Returns the index of the component for the first occurrence of the exact given \a value among the first N components.
		/// Returns -1 if no component matches. ( return self ?= component )
		template <int N> HK_FORCE_INLINE int findComponent(hkSimdFloat32Parameter value) const;

		/// Set self to a component permutation of \a v. See the symbols in hkVectorPermutation.
		template <hkVectorPermutation::Permutation P> HK_FORCE_INLINE void setPermutation(hkVector4fParameter v);

		/// Set the value of component I of self on all components of self.
		template <int I> HK_FORCE_INLINE void broadcast();

		/// Set the value of component \a i of self on all components of self.
		/// \remark Use this method only when the component index is not a compile time constant.
		HK_FORCE_INLINE void broadcast(int i);

		/// Set the value of component I of \a v on all components of self.
		template <int I> HK_FORCE_INLINE void setBroadcast(hkVector4fParameter v);

		/// Set the value of component \a i of \a v on all components of self.
		/// \remark Use this method only when the component index is not a compile time constant.
		HK_FORCE_INLINE void setBroadcast(const int i, hkVector4fParameter v);

		/// Returns true if the length of self is one within the given \a epsilon bounds.
		template <int N> HK_FORCE_INLINE bool isNormalized(hkFloat32 epsilon = hkFloat32(1e-4f)) const;

		/// Get a constant vector with all components zero.
		HK_FORCE_INLINE static const hkVector4f& HK_CALL getZero();

		/// Get a constant vector. See the symbols in hkVectorConstant.
		template<int vectorConstant>
		HK_FORCE_INLINE static const hkVector4f& HK_CALL getConstant();

		/// Get a constant vector. See the symbols in hkVectorConstant.
		/// \remark Use this method only when the constant is not known at compile time.
		HK_FORCE_INLINE static const hkVector4f& HK_CALL getConstant(hkVectorConstant constant);

		/// Set this vector to a constant.
		template<int vectorConstant>
		HK_FORCE_INLINE void setConstant();

		/// Normalizes \a v as an N-component vector, stores with self and returns the length of \a v before normalization. ( return self = |v| ).
		/// If \a v is zero (within machine epsilon), self is set to the unit vector (1,0,0,0).
		/// See the documentation at the template values for the requested behavior.
		template <int N, hkMathAccuracyMode A> HK_FORCE_INLINE const hkSimdFloat32 setNormalizedEnsureUnitLength(hkVector4fParameter v);
};

#endif //HK_MATH_VECTOR4f_H
